package com.guomao.charStream;

import java.io.*;

public class DirectoryCopier {
    public static void main(String[] args) {
        String sourcePath = "D:/guomaolesson";
        String targetParentPath = "D:/bak";  // 目标父目录
        String dirName = new File(sourcePath).getName();  // 获取源目录名(guomaolesson)
        String targetPath = targetParentPath + File.separator + dirName;  // 完整目标路径

        try {
            copyDirectory(new File(sourcePath), new File(targetPath));
            System.out.println("目录复制完成！结果在: " + targetPath);
        } catch (IOException e) {
            System.err.println("复制过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 递归复制目录及其所有子目录和文件
     *
     * @param source 源目录
     * @param target 目标目录(将创建与源目录同名的目录)
     * @throws IOException
     */
    public static void copyDirectory(File source, File target) throws IOException {
        // 如果源目录不存在，抛出异常
        if (!source.exists()) {
            throw new IOException("源目录不存在: " + source.getAbsolutePath());
        }

        // 如果目标是文件，抛出异常
        if (target.exists() && target.isFile()) {
            throw new IOException("目标路径是一个已存在的文件: " + target.getAbsolutePath());
        }

        // 如果目标目录不存在，则创建
        if (!target.exists()) {
            if (!target.mkdirs()) {
                throw new IOException("无法创建目标目录: " + target.getAbsolutePath());
            }
        }

        // 获取源目录下的所有文件和子目录
        File[] files = source.listFiles();
        if (files == null) {
            return;
        }

        for (File file : files) {
            File targetFile = new File(target, file.getName());

            if (file.isDirectory()) {
                // 递归复制子目录
                copyDirectory(file, targetFile);
            } else {
                // 复制文件
                copyFile(file, targetFile);
            }
        }
    }

    /**
     * 复制单个文件
     *
     * @param sourceFile 源文件
     * @param targetFile 目标文件
     * @throws IOException
     */
    private static void copyFile(File sourceFile, File targetFile) throws IOException {
        try (InputStream in = new FileInputStream(sourceFile);
             OutputStream out = new FileOutputStream(targetFile)) {

            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        }
    }
}